﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.UI
{
    public class GetUIList
    {
        int _count;



        public int Count(int idProyecto, int idEtapa, 
                      
                          string tipoUIStr,
                           string idestadoStr,
                           string idLocalizacionStr,
                           string idTipoModeloStr,
                           string codigoStr,
                           bool bitVerAnula,
                             int startRowIndex,
                             int maximumRows,
                            string sortExpression)
        {
            return _count;
        }



        private IQueryable<UIListInfo> ApplySelect_UIListInfo()
        {
            var q = from a in DbUtil.Db.UIs
                    select new UIListInfo
                    {
                        bitActivo=a.bitActivo,
                         bitActivoEtapa=a.Etapa.bitActivo,
                        codigo=a.codigo,
                        descripcion=a.descripcion,
                        estadoStr=a.EstadoItem.descripcion,
                       idProyecto=a.Etapa.idProyecto,
                           etapaStr=a.Etapa.descripcion,
                        idInternal=a.idInternal,
                        localizacionStr=a.UILocalizacion.descripcion,
                        montoSeparacionStr=String.Format("{0}{1:N}",a.Moneda.simbol,a.montoSeparacion),
                        precioStr=String.Format("{0}{1:N}",a.Moneda.simbol,a.precio),
                        tipoBloqueStr=a.UIBloque.descripcion,
                        tipoModeloStr=a.UIModeloTipo.descripcion,
                        tipoUIStr=a.UITipo.descripcion,
                        montoSeparacion=a.montoSeparacion,
                        precio=a.precio,
                        idEstado=a.idEstado,
                        idTipoUI=a.idTipoUI,
                        idLocalizacion=a.idLocalizacion,
                        idTipoBloque=a.idTipoBloquePiso,
                        idTipoModelo=a.idTipoModelo,
                        idEtapa=a.idEtapa,
                        areaTechada= a.areaTechada.Value,
                        areaOcupada=a.areaOcupada.Value,
                        areaStr = String.Format("{0:N}", a.areaTerreno),

                        
                    };
            return q;
        }
        private IQueryable<UIListInfo> ApplySort(IQueryable<UIListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "bitActivo":
                    q = q.OrderBy(b => b.bitActivo);
                    break;
                case "bitActivo DESC":
                    q = q.OrderByDescending(b => b.bitActivo);
                    break;

                case "areaTechada":
                    q = q.OrderBy(b => b.areaTechada);
                    break;
                case "areaTechada DESC":
                    q = q.OrderByDescending(b => b.areaTechada);
                    break;
                case "areaOcupada":
                    q = q.OrderBy(b => b.areaOcupada);
                    break;
                case "areaOcupada DESC":
                    q = q.OrderByDescending(b => b.areaOcupada);
                    break;

                case "nroBanio":
                    q = q.OrderBy(b => b.nroBanio);
                    break;
                case "nroBanio DESC":
                    q = q.OrderByDescending(b => b.nroBanio);
                    break;

                case "nroDormitorio":
                    q = q.OrderBy(b => b.nroDormitorio);
                    break;

                case "nroDormitorio DESC":
                    q = q.OrderByDescending(b => b.nroDormitorio);
                    break;

                case "codigo":
                    q = q.OrderBy(b => b.codigo);
                    break;
                case "codigo DESC":
                    q = q.OrderByDescending(b => b.codigo);
                    break;


                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;


                case "estadoStr":
                    q = q.OrderBy(b => b.estadoStr);
                    break;
                case "estadoStr DESC":
                    q = q.OrderByDescending(b => b.estadoStr);
                    break;


                

                case "localizacionStr":
                    q = q.OrderBy(b => b.localizacionStr);
                    break;
                case "localizacionStr DESC":
                    q = q.OrderByDescending(b => b.localizacionStr);
                    break;
                case "montoSeparacionStr":
                    q = q.OrderBy(b => b.montoSeparacionStr);
                    break;
                case "montoSeparacionStr DESC":
                    q = q.OrderByDescending(b => b.montoSeparacionStr);
                    break;
                case "precio":
                    q = q.OrderBy(b => b.precio);
                    break;
                case "precio DESC":
                    q = q.OrderByDescending(b => b.precio);
                    break;

                case "tipoBloqueStr":
                    q = q.OrderBy(b => b.tipoBloqueStr);
                    break;
                case "tipoBloqueStr DESC":
                    q = q.OrderByDescending(b => b.tipoBloqueStr);
                    break;

                case "tipoModeloStr":
                    q = q.OrderBy(b => b.tipoModeloStr);
                    break;
                case "tipoModeloStr DESC":
                    q = q.OrderByDescending(b => b.tipoModeloStr);
                    break;


                case "tipoUIStr":
                    q = q.OrderBy(b => b.tipoUIStr);
                    break;
                case "tipoUIStr DESC":
                    q = q.OrderByDescending(b => b.tipoUIStr);
                    break;

               
                
                default:
                    q = q.OrderBy(f=>f.localizacionStr).OrderBy(p => p.descripcion);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<UIListInfo> Execute(int  idProyecto,
                                               int idEtapa,
                                               string tipoUIStr,
                                               string idestadoStr,
                                               string idLocalizacionStr,
                                               string idTipoModeloStr,
                                               string codigoStr,
                                               bool bitVerAnula,
                                                 int startRowIndex,
                                                 int maximumRows,
                                                string sortExpression)
        {
            if (!codigoStr.HasValue())
                codigoStr = "";
            if (!idLocalizacionStr.HasValue())
                idLocalizacionStr = "0";

            


            var q = ApplySelect_UIListInfo();
            //siempre de la empresa




            q = q.Where(a => a.idProyecto == idProyecto
                              & a.bitActivoEtapa==true
                              & (idEtapa == 0 ? a.idEtapa != 0 : a.idEtapa == idEtapa)
                              &(a.bitActivo == true | a.bitActivo == !bitVerAnula)
                              & (a.codigo + a.descripcion).Contains(codigoStr)
                              & (idestadoStr == "0" ? a.idEstado != 0 : a.idEstado == Convert.ToInt32(idestadoStr))
                             // & (idFinanciamientoStr=="0"? a.idFinanciamiento!=0: a.idFinanciamiento == Convert.ToInt32(idFinanciamientoStr))
                              & (tipoUIStr == "0" ? a.idTipoUI != 0 : a.idTipoUI == Convert.ToInt32(tipoUIStr))
                              & (idLocalizacionStr=="0"? a.idLocalizacion!=0: a.idLocalizacion == Convert.ToInt32(idLocalizacionStr))
                              & (idTipoModeloStr=="0"? a.idTipoModelo!=0: a.idTipoModelo== Convert.ToInt32(idTipoModeloStr))
                            );




            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }




    }
}
